對於 Application 我們該如何取得Token及登入Vault?
跟人類的行為不同,應用程式不能一直輸入 Username 及 Password,因為 username 及 password 通常是敏感資訊,也因此,Hashicorp vault 提供了幾種 Auth 的方法,例如 AppRole、JWT等方式。
而 AppRole 則是比較適合應用程式獲取 Vault token的方式。
啟用 AppRole:vault auth enable approle
查看既有auth method:vault auth list

接著,還記得我們之前建立過的 policy 嗎? 這時候我們也需要一個用於 App 的 policy:
path "database/creds/my-role" {
capabilities = ["read"]
}
vault policy write myapp-policy myapp-policy.hcl
有了Policy後,再建立app role 並 apply給它:
vault write auth/approle/role/myapp \
token_policies="myapp-policy" \
token_ttl="1h" \
token_max_ttl="4h"
取得Role:
grantli@xxx:~$ vault read auth/approle/role/myapp/role-id
Key Value
--- -----
role_id db82865c-fbfc-82fd-0645-794c0df1d3f8
再產生 SecretID:
vault write -f auth/approle/role/myapp/secret-id
會看到對應的資訊已經產生:
curl -k \
--request POST \
--data '{
"role_id": "db82865c-fbfc-82fd-0645-794c0df1d3f8",
"secret_id": "abf01d94-01a3-6b58-0d98-6f9a6693ac32"
}' \
https://127.0.0.1:8200/v1/auth/approle/login
如果看到以下輸出就代表成功了!!
{"request_id":"787481a5-740a-49a6-1e05-2b66e06e40d8","lease_id":"","renewable":false,"lease_duration":0,"data":null,"wrap_info":null,"warnings":null,"auth":{"client_token":"hvs.CAESIEN6Z2Fiz9MuCkuNsn1vNNdb1Gs03Ii9263ZdkDYv6azGh4KHGh2cy52QWM0YXFabmY5N3lpVHpkT3duZmo5NW0","accessor":"oQViaYD8aM5yHU7qrL6opOna","policies":["default","myapp-policy"],"token_policies":["default","myapp-policy"],"metadata":{"role_name":"myapp"},"lease_duration":3600,"renewable":true,"entity_id":"fc690680-999c-d027-4819-2a30f9e6dc8c","token_type":"service","orphan":true,"mfa_requirement":null,"num_uses":0},"mount_type":""}
接著,在 response 中,我們可以看到其中一個 attribute "client_token" 便是我們之後用來存取各項credential 的憑證。
hvs.CAESIEN6Z2Fiz9MuCkuNsn1vNNdb1Gs03Ii9263ZdkDYv6azGh4KHGh2cy52QWM0YXFabmY5N3lpVHpkT3duZmo5NW0
例如透過 curl 存取我們在前一天建立的 database role,就可以得到 Dynamic secret:
curl -k \
--header "X-Vault-Token: hvs.CAESIEN6Z2Fiz9MuCkuNsn1vNNdb1Gs03Ii9263ZdkDYv6azGh4KHGh2cy52QWM0YXFabmY5N3lpVHpkT3duZmo5NW0" \
https://127.0.0.1:8200/v1/database/creds/my-role
今天以應用程式的視角,進行驗證並 based on 對應的 policy 及 role 獲得 Vault 的 credentials,總而言之,與人不同,Application不會執行 vault login command,而是透過如 curl、http request 驗證、獲取token,進而進行進一步的行為。